import { get, post, put, del, patch } from '@/utils/request'
import { MenuItem } from '@/types/menu'
import { ApiResponse } from '@/types/auth'

/**
 * 菜单查询参数接口
 */
export interface MenuQuery {
  name?: string
  key?: string
  parentKey?: string
  hidden?: boolean
  page?: number
  pageSize?: number
}

/**
 * 菜单创建/更新数据接口 - 匹配后端DTO结构
 */
export interface MenuFormData {
  name: string
  key: string
  parentId?: number | null
  path?: string
  icon?: string
  component?: string
  hidden?: boolean
  breadcrumbHidden?: boolean
  permission?: string | null
  title?: string
  keepAlive?: boolean
  affix?: boolean
  closable?: boolean
  type?: number
  sort?: number
  status?: number
}

/**
 * 菜单服务类
 * 提供菜单管理相关的API接口
 */
class MenuService {
  /**
   * 获取菜单列表（树形结构）
   * @returns Promise<ApiResponse<MenuItem[]>> 返回菜单树形数据
   */
  async getMenuList(): Promise<ApiResponse<MenuItem[]>> {
    return get('/menu/tree')
  }

  /**
   * 获取菜单列表（扁平结构，用于表格显示）
   * @param params 查询参数
   * @returns Promise<ApiResponse<MenuItem[]>> 返回扁平菜单数据
   */
  async getMenuListFlat(params?: MenuQuery): Promise<ApiResponse<MenuItem[]>> {
    return get('/menu', { params })
  }

  /**
   * 根据ID获取菜单详情
   * @param key 菜单标识
   * @returns Promise<ApiResponse<MenuItem>> 返回菜单详情
   */
  async getMenuByKey(key: string): Promise<ApiResponse<MenuItem>> {
    return get(`/menu/${key}`)
  }

  /**
   * 创建菜单
   * @param data 菜单数据
   * @returns Promise<ApiResponse<MenuItem>> 返回创建的菜单
   */
  async createMenu(data: MenuFormData): Promise<ApiResponse<MenuItem>> {
    return post('/menu', data)
  }

  /**
   * 更新菜单
   * @param key 菜单标识
   * @param data 更新的菜单数据
   * @returns Promise<ApiResponse<MenuItem>> 返回更新后的菜单
   */
  async updateMenu(key: string, data: Partial<MenuFormData>): Promise<ApiResponse<MenuItem>> {
    return put(`/menu/key/${key}`, data)
  }

  /**
   * 删除菜单
   * @param id 菜单ID
   * @returns Promise<ApiResponse> 返回删除结果
   */
  async deleteMenu(id: string | number): Promise<ApiResponse> {
    return del(`/menu/${id}`)
  }

  /**
   * 批量删除菜单
   * @param keys 菜单标识数组
   * @returns Promise<ApiResponse> 返回删除结果
   */
  async batchDeleteMenus(keys: string[]): Promise<ApiResponse> {
    return del('/menu/batch', { data: { keys } })
  }

  /**
   * 获取用户权限菜单
   * @returns Promise<ApiResponse<MenuItem[]>> 返回用户有权限的菜单
   */
  async getUserMenus(): Promise<ApiResponse<MenuItem[]>> {
    const response = await get('/menu/user-menus')
    
    // 转换后端数据结构为前端MenuItem格式
    if (response.code === 200 && response.data) {
      response.data = this.transformBackendMenusToFrontend(response.data)
    }
    
    return response
  }

  /**
   * 将后端菜单数据转换为前端MenuItem格式
   * @param backendMenus 后端菜单数据
   * @returns MenuItem[] 前端菜单格式
   */
  private transformBackendMenusToFrontend(backendMenus: any[]): MenuItem[] {
    return backendMenus.map(menu => {
      // 只转换type为1(目录)或2(菜单)的项，过滤掉type为3(按钮权限)的项
      if (menu.type === 3) {
        return null // 按钮权限不显示在菜单中
      }

      const menuItem: MenuItem = {
        key: menu.key || menu.id?.toString(),
        name: menu.name || menu.title,
        path: menu.path,
        icon: menu.icon,
        hidden: menu.hidden || false,
        breadcrumbHidden: menu.breadcrumbHidden || false,
        component: menu.component,
        permission: menu.permission ? [menu.permission] : undefined,
        meta: {
          title: menu.title || menu.name,
          keepAlive: menu.keepAlive || false,
          affix: menu.affix || false,
          closable: menu.closable !== false
        }
      }

      // 递归处理子菜单
      if (menu.children && menu.children.length > 0) {
        const childrenMenus = this.transformBackendMenusToFrontend(menu.children)
        // 过滤掉null值（按钮权限）
        menuItem.children = childrenMenus.filter(child => child !== null)
        
        // 如果没有有效的子菜单，则移除children属性
        if (menuItem.children.length === 0) {
          delete menuItem.children
        }
      }

      return menuItem
    }).filter(menu => menu !== null) // 过滤掉null值
  }

  /**
   * 更新菜单排序
   * @param data 排序数据
   * @returns Promise<ApiResponse> 返回更新结果
   */
  async updateMenuSort(data: { key: string; sort: number }[]): Promise<ApiResponse> {
    return post('/menu/sort', data)
  }

  /**
   * 切换菜单显示/隐藏状态
   * @param key 菜单标识
   * @param hidden 是否隐藏
   * @returns Promise<ApiResponse> 返回更新结果
   */
  async toggleMenuVisibility(key: string, hidden: boolean): Promise<ApiResponse> {
    return post(`/menus/${key}/toggle-visibility`, { hidden })
  }

  /**
   * 获取菜单树形选择器数据（用于父级菜单选择）
   * @returns Promise<ApiResponse<MenuItem[]>> 返回树形选择器数据
   */
  async getMenuTreeSelect(): Promise<ApiResponse<MenuItem[]>> {
    return get('/menus/tree-select')
  }
}

export default new MenuService()